<template>
  <li>
    <label>
<!--      这里勾选和取消勾选可以使用change和click作为事件处理-->
      <input type="checkbox" :checked="todo.done" @change="handleCheck(todo.id)"/>
      <!--v-model数据的双向绑定，checkbox使用v-model来双向绑定其是否被勾选,也可以实现效果但不推荐(因为其实修改了props中的数据)-->
      <!--这里修改了从List修改过来的props,这里的不允许改是浅层次，就是如果props是一个对象则这个修改这个对象的某一个属性vue是放行的-->
      <!-- <input type="checkbox" v-model="todo.done"/>-->
      <span v-show="!todo.isEdit">{{  todo.title }}</span>
      <input 
        type="text"  
        v-show="todo.isEdit"  
        :value="todo.title" 
        @blur="handleBlur(todo, $event)"
        ref="inputTitle"  
      >
    </label>
    <button class="btn btn-danger" @click="handleDelete(todo.id)">删除</button>
    <button v-show="!todo.isEdit" class="btn btn-edit" @click="handleEdit(todo)">编辑</button>
  </li>
</template>

<script>
  import pubsub from 'pubsub-js'
  export default {
    name: 'MyItem',
    //声明接收todo对象
    props: ['todo'],

    methods:{
      //勾选or取消勾选
      handleCheck(id){
        //通知App组件将对应的todo对象的done值取反
        // this.checkTodo(id)
        this.$bus.$emit('checkTodo', id)
      },
      //删除
      handleDelete(id){
        //通知App组件将对应的todo对象删除
        if(confirm('确定删除吗？')){
          // this.deleteTodo(id)
          // this.$bus.$emit('deleteTodo', id)  //全局事件总线
          pubsub.publish('deleteTodo', id)  //消息订阅与发布
        }
      },

      handleEdit(todo) {
        // todo.isEdit = true  //此种添加方式不是响应式的
        if(todo['isEdit'] !== undefined){
          todo.isEdit = true
        }else{
          this.$set(todo, 'isEdit', true)  //响应式的添加方式
        }

        //输入框自动获取焦点
        //nextTick所指定的回调会在dom节点更新完毕之后再执行
        this.$nextTick(function(){
          this.$refs.inputTitle.focus()
        })

      },

      //失去焦点回调（真正执行修改逻辑）
      handleBlur(todo, e){
        todo.isEdit = false
        if(!e.target.value.trim())  return alert('输入不能为空！')
        this.$bus.$emit('updateTodo', todo.id, e.target.value)
      }


    }

  }
</script>

<style scoped>
  /*item*/
  li {
    list-style: none;
    height: 36px;
    line-height: 36px;
    padding: 0 5px;
    border-bottom: 1px solid #ddd;
    overflow: hidden;
  }

  li label {
    float: left;
    cursor: pointer;
  }

  /*
  li label li input {
    vertical-align: middle;
    margin-right: 6px;
    position: relative;
    top: -1px;
  }
  */

  li label > input {
    /*vertical-align: middle;  */
    margin-right: 6px;
    position: relative;
    line-height: normal;
    
  }

  li button {
    float: right;
    display: none;
    margin-top: 3px;
  }

  li:before {
    content: initial;
  }

  li:last-child {
    border-bottom: none;
  }

  li:hover{
    background: #ddd;
  }

  li:hover button{
    display: block;
  }


</style>